Method-Level Security হল Spring Security-এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা আপনাকে ক্লাস বা মেথড স্তরে নিরাপত্তা নিয়ন্ত্রণ করতে দেয়। এর মাধ্যমে আপনি নির্দিষ্ট মেথড বা ক্লাসের জন্য authentication এবং authorization নির্ধারণ করতে পারেন, যাতে শুধুমাত্র নির্দিষ্ট রোল বা প্রিভিলেজধারী ব্যবহারকারী সেই মেথড বা ক্লাস অ্যাক্সেস করতে পারে।
Spring Security-তে মেথড লেভেলে নিরাপত্তা চালু করতে @EnableGlobalMethodSecurity অ্যানোটেশন ব্যবহার করা হয়, এবং এর মধ্যে আপনি prePostEnabled, securedEnabled, অথবা jsr250Enabled অপশন ব্যবহার করতে পারেন।
Method-Level Security এর বিভিন্ন ধরনের কনফিগারেশন
Spring Security-তে মেথড-লেভেল সিকিউরিটি কনফিগার করার জন্য প্রধানত তিনটি পদ্ধতি ব্যবহার করা হয়:
- @Secured
- @PreAuthorize / @PostAuthorize
- @RolesAllowed (JSR-250 Annotations)
1. @EnableGlobalMethodSecurity ব্যবহার করা
প্রথমে Spring Security-তে Method-Level Security সক্ষম করতে @EnableGlobalMethodSecurity অ্যানোটেশন ব্যবহার করতে হবে। এই অ্যানোটেশনটি ক্লাস বা কনফিগারেশনে ব্যবহার করতে হবে, এবং এর মধ্যে আপনি কোন ধরনের নিরাপত্তা সক্ষম করবেন তা নির্ধারণ করতে পারেন।
উদাহরণ (Method-Level Security Enable):
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
// Security Configuration Code
}
- prePostEnabled:
@PreAuthorizeএবং@PostAuthorizeঅ্যানোটেশনগুলি সক্রিয় করে। - securedEnabled:
@Securedঅ্যানোটেশন সক্রিয় করে। - jsr250Enabled:
@RolesAllowedঅ্যানোটেশন সক্রিয় করে।
2. @Secured
@Secured অ্যানোটেশনটি ব্যবহারকারীর রোল ভিত্তিক অ্যাক্সেস কন্ট্রোল প্রয়োগ করতে সাহায্য করে। এটি সাধারণত মেথডের উপর রোল বা প্রিভিলেজ অ্যাসাইন করতে ব্যবহৃত হয়।
উদাহরণ (Secured Annotation):
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@Secured("ROLE_ADMIN")
public void performAdminTask() {
System.out.println("Admin Task Performed");
}
@Secured({"ROLE_USER", "ROLE_ADMIN"})
public void performUserOrAdminTask() {
System.out.println("User or Admin Task Performed");
}
}
- এখানে performAdminTask মেথডটি শুধুমাত্র
ROLE_ADMINরোলধারী ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য। - performUserOrAdminTask মেথডটি
ROLE_USERএবংROLE_ADMINউভয় রোলধারী ব্যবহারকারীদের জন্য অ্যাক্সেসযোগ্য।
3. @PreAuthorize এবং @PostAuthorize
@PreAuthorize এবং @PostAuthorize অ্যানোটেশনগুলি অধিক কাস্টমাইজেবল নিরাপত্তা কন্ট্রোল প্রদান করে। @PreAuthorize মেথড চালানোর আগে অ্যাক্সেস কন্ট্রোল চেক করে, এবং @PostAuthorize মেথড শেষ হওয়ার পর।
উদাহরণ (PreAuthorize / PostAuthorize):
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@PreAuthorize("hasRole('ADMIN') and #userId == authentication.name")
public void performTaskForUser(String userId) {
System.out.println("Task performed for user: " + userId);
}
@PostAuthorize("returnObject.username == authentication.name")
public User getUserDetails(String userId) {
return new User(userId, "Some Details");
}
}
- @PreAuthorize:
performTaskForUserমেথডটি শুধুমাত্র তখনই এক্সিকিউট হবে যখন ব্যবহারকারী ADMIN রোলধারী হবে এবং তারuserIdমেথডে পাঠানোuserIdএর সমান হবে। - @PostAuthorize:
getUserDetailsমেথডের শেষে, এটি চেক করবে যে রিটার্ন হওয়া অবজেক্টেরusernameব্যবহারকারীরauthentication.nameএর সাথে মেলে কিনা।
4. @RolesAllowed (JSR-250)
@RolesAllowed JSR-250 স্ট্যান্ডার্ডের অংশ এবং এটি মেথডের জন্য রোল নির্ধারণ করে। এটি @Secured এর মতো কাজ করে, তবে এটি Java EE-এর অংশ এবং সাধারণত Java EE অথবা Spring Framework সহ ব্যবহৃত হয়।
উদাহরণ (RolesAllowed):
import javax.annotation.security.RolesAllowed;
import org.springframework.stereotype.Service;
@Service
public class MyService {
@RolesAllowed("ADMIN")
public void performAdminTask() {
System.out.println("Admin Task Performed");
}
@RolesAllowed({"USER", "ADMIN"})
public void performUserOrAdminTask() {
System.out.println("User or Admin Task Performed");
}
}
- @RolesAllowed: এই অ্যানোটেশনটি
ROLE_ADMINবাROLE_USERব্যবহারকারীকে মেথড অ্যাক্সেসের অনুমতি দেয়।
Method-Level Security এর অন্যান্য গুরুত্বপূর্ণ বিষয়
কাস্টম নিরাপত্তা চেক: আপনি
@PreAuthorizeঅথবা@PostAuthorizeএর মধ্যে SpEL (Spring Expression Language) ব্যবহার করে কাস্টম নিরাপত্তা চেক করতে পারেন।উদাহরণ:
@PreAuthorize("hasPermission(#document, 'read')") public void readDocument(Document document) { // Document পড়া }Method-Level Security Testing: আপনি
@Secured,@PreAuthorize, অথবা@RolesAllowedএর নিরাপত্তা পরীক্ষা করতে পারেন@WithMockUserব্যবহার করে।উদাহরণ:
@Test @WithMockUser(roles = "ADMIN") public void testAdminTask() { myService.performAdminTask(); // This should work }SpEL (Spring Expression Language):
@PreAuthorizeএবং@PostAuthorizeঅ্যানোটেশনগুলির মধ্যে SpEL ব্যবহার করা যেতে পারে, যা আপনাকে আরও কাস্টম এবং শর্তাধীন অনুমতি প্রদান করতে সক্ষম করে।উদাহরণ:
@PreAuthorize("hasRole('ADMIN') or #userId == authentication.name") public void someMethod(String userId) { // Perform some task }
উপসংহার
Spring Security-তে Method-Level Security হল একটি শক্তিশালী টুল যা আপনাকে নিরাপত্তা নিয়ন্ত্রণের আরও উচ্চ স্তরের কাস্টমাইজেশন প্রদান করে। আপনি মেথড বা ক্লাসের উপর ভিত্তি করে ব্যবহারকারীর রোল, প্রিভিলেজ এবং অন্যান্য শর্ত অনুযায়ী অ্যাক্সেস কন্ট্রোল করতে পারবেন। @Secured, @PreAuthorize, @PostAuthorize, এবং @RolesAllowed এর মাধ্যমে সহজে মেথড নিরাপত্তা পরিচালনা করা সম্ভব।
Method-level security হল Spring Security-এর একটি বৈশিষ্ট্য যা আপনাকে নির্দিষ্ট মেথডের জন্য নিরাপত্তা কনফিগার করার সুবিধা দেয়। এর মাধ্যমে আপনি শুধুমাত্র নির্দিষ্ট রোল, পারমিশন বা শর্তের অধীনে একটি মেথড অ্যাক্সেস করার অনুমতি দিতে পারেন। এটি মূলত annotation-based security প্রয়োগে ব্যবহৃত হয় এবং খুবই কার্যকরী যখন আপনি fine-grained control চান যে কোন ব্যবহারকারী বা রোল কোন ফিচার অ্যাক্সেস করতে পারবে।
Spring Security-তে method-level security কে প্রাথমিকভাবে দুইটি মূল উপায়ে ব্যবহার করা হয়:
- Authorization (অথরাইজেশন) – কোন ব্যবহারকারী বা রোল কে কোন মেথড অ্যাক্সেস করতে পারবে তা নির্ধারণ করা।
- Authentication (প্রমাণীকরণ) – কোন ব্যবহারকারী সিস্টেমে লগ ইন করেছেন এবং তাদের শংসাপত্র যাচাই করা।
Spring Security Method-Level Security-এর প্রধান ধরনের Annotation
@PreAuthorize@PreAuthorizeannotation ব্যবহার করে মেথডের আগে authorization চেক করা হয়। এটিSpEL (Spring Expression Language)ব্যবহার করে condition নির্ধারণ করতে পারে।
@Secured@Securedannotation শুধু নির্দিষ্ট রোল বা পারমিশন মেনে মেথড অ্যাক্সেস করতে অনুমতি দেয়। তবে এটিSpELএর চেয়ে কম ফ্লেক্সিবল।
@PostAuthorize@PostAuthorizeannotation ব্যবহার করে মেথডের পর authorization চেক করা হয়। এটি মূলত মেথডের আউটপুট পর্যালোচনা করার জন্য ব্যবহৃত হয়।
@RolesAllowed@RolesAllowedannotation Java EE এর একটি অংশ এবং এটি সেভাবে Spring Security এর মাধ্যমে কাজ করে। তবে এটি@Securedএর মতো রোল চেক করতে ব্যবহৃত হয়।
Method-Level Security সক্রিয় করা
1. Method-level security সক্রিয় করা
Spring Security-তে method-level security ব্যবহারের জন্য @EnableGlobalMethodSecurity annotation যোগ করতে হয়। এটি আপনার Spring Security configuration ক্লাসে থাকতে হবে।
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig {
// Configuration for method-level security
}
prePostEnabled = true: এটি@PreAuthorizeএবং@PostAuthorizeব্যবহার করতে সক্ষম করবে।securedEnabled = true: এটি@Securedannotation এর ব্যবহার সক্ষম করবে।
Method-Level Security Example
1. @PreAuthorize ব্যবহার
@PreAuthorize ব্যবহার করে মেথডের আগে condition চেক করা হয়। এখানে আমরা SpEL ব্যবহার করছি যা রোল বা পারমিশনের উপর ভিত্তি করে মেথড অ্যাক্সেস নিয়ন্ত্রণ করবে।
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@PreAuthorize("hasRole('ADMIN')")
public void createProduct() {
System.out.println("Product created!");
}
@PreAuthorize("hasRole('USER') or hasRole('ADMIN')")
public void viewProduct() {
System.out.println("Product viewed!");
}
@PreAuthorize("hasPermission(#productId, 'Product', 'READ')")
public void viewProductDetails(Long productId) {
System.out.println("Product details viewed for productId: " + productId);
}
}
@PreAuthorize("hasRole('ADMIN')"): শুধুমাত্র ADMIN রোলের ব্যবহারকারীরাcreateProduct()মেথডটি অ্যাক্সেস করতে পারবেন।@PreAuthorize("hasRole('USER') or hasRole('ADMIN')"): USER বা ADMIN রোলের ব্যবহারকারীviewProduct()মেথডটি অ্যাক্সেস করতে পারবেন।@PreAuthorize("hasPermission(#productId, 'Product', 'READ')"): এই method-এhasPermissionব্যবহার করে permission ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ করা হয়েছে।
2. @Secured ব্যবহার
@Secured একটি নির্দিষ্ট রোল বা permission ভিত্তিক অ্যাক্সেস নিয়ন্ত্রণ করতে ব্যবহৃত হয়। এটি খুবই সরল এবং SpEL এর চেয়ে কম ফ্লেক্সিবল।
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Secured("ROLE_ADMIN")
public void createProduct() {
System.out.println("Product created!");
}
@Secured({"ROLE_USER", "ROLE_ADMIN"})
public void viewProduct() {
System.out.println("Product viewed!");
}
}
@Secured("ROLE_ADMIN"): শুধুমাত্র ROLE_ADMIN ব্যবহারকারীcreateProduct()মেথড অ্যাক্সেস করতে পারবেন।@Secured({"ROLE_USER", "ROLE_ADMIN"}): ROLE_USER বা ROLE_ADMIN ব্যবহারকারীviewProduct()মেথড অ্যাক্সেস করতে পারবেন।
3. @PostAuthorize ব্যবহার
@PostAuthorize annotation মেথডের পরে ব্যবহার করা হয়। এটি মেথডের আউটপুট যাচাই করার জন্য ব্যবহৃত হয়।
import org.springframework.security.access.prepost.PostAuthorize;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@PostAuthorize("returnObject.owner == authentication.name")
public Product getProduct(Long productId) {
return productRepository.findById(productId).orElse(null);
}
}
@PostAuthorize("returnObject.owner == authentication.name"): এটি চেক করে যেProductঅবজেক্টটিরownerবর্তমানে লগ ইন করা ব্যবহারকারীর নামের সাথে মেলাচ্ছে কি না।
৪. @RolesAllowed ব্যবহার
@RolesAllowed Java EE-এর একটি annotation এবং Spring Security-এও এটি ব্যবহৃত হয়। এটি শুধুমাত্র নির্দিষ্ট রোলগুলির জন্য মেথড অ্যাক্সেস প্রদান করে।
import javax.annotation.security.RolesAllowed;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@RolesAllowed("ADMIN")
public void createProduct() {
System.out.println("Product created!");
}
@RolesAllowed({"USER", "ADMIN"})
public void viewProduct() {
System.out.println("Product viewed!");
}
}
@RolesAllowed("ADMIN"): শুধুমাত্র ADMIN রোলের ব্যবহারকারীcreateProduct()মেথডটি অ্যাক্সেস করতে পারবেন।
Conclusion
Spring Security-তে method-level security ব্যবহারের মাধ্যমে আপনি নির্দিষ্ট মেথডের জন্য নিরাপত্তা নিয়ন্ত্রণ করতে পারেন। এটি fine-grained access control প্রদান করে, যেখানে আপনি নির্দিষ্ট রোল, পারমিশন বা শর্তের উপর ভিত্তি করে মেথড অ্যাক্সেস নিয়ন্ত্রণ করতে পারেন। Spring Security-তে বিভিন্ন ধরনের annotations (যেমন @PreAuthorize, @Secured, @PostAuthorize, @RolesAllowed) ব্যবহার করে মেথড-ভিত্তিক নিরাপত্তা কনফিগার করা যায়।
স্প্রিং সিকিউরিটির @PreAuthorize, @PostAuthorize, এবং @Secured অ্যানোটেশনগুলি মেথড লেভেল সিকিউরিটি প্রয়োগ করতে ব্যবহৃত হয়। এগুলি আপনাকে স্প্রিং অ্যাপ্লিকেশনগুলিতে সিকিউরিটি নিয়মগুলো সরাসরি মেথডের উপর প্রয়োগ করার সুবিধা দেয়, যা কোডে রোল-ভিত্তিক অথরাইজেশন বা এক্সপ্রেশন-ভিত্তিক অথরাইজেশন নির্ধারণ করতে সাহায্য করে।
১. @PreAuthorize অ্যানোটেশন
@PreAuthorize অ্যানোটেশনটি একটি মেথড এক্সিকিউট হওয়ার আগে নির্দিষ্ট শর্ত পূর্ণ হলে এক্সিকিউশন অনুমোদন দেয়। এটি স্প্রিং এলএক্সপ্রেশন ল্যাঙ্গুয়েজ (SpEL) ব্যবহার করে শর্ত নির্ধারণ করতে পারে।
ব্যবহার:
@PreAuthorizeঅ্যানোটেশন ব্যবহার করে আপনি মেথডের এক্সিকিউশন আগে নিশ্চিত করতে পারেন যে নির্দিষ্ট শর্ত বা অনুমতি রয়েছে।- সাধারণত স্প্রিং সিকিউরিটি কনফিগারেশনের মাধ্যমে অ্যাক্সেস কন্ট্রোল ইমপ্লিমেন্ট করা হয়।
উদাহরণ:
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(Long userId) {
// মেথড যা শুধুমাত্র ADMIN রোল থাকা ইউজারের জন্য এক্সিকিউট হবে
userRepository.deleteById(userId);
}
এখানে, deleteUser মেথডটি শুধুমাত্র সেই ব্যবহারকারীদের জন্য এক্সিকিউট হবে যাদের রোল "ADMIN"।
@PreAuthorize অ্যানোটেশনে স্পেল এক্সপ্রেশন ব্যবহার করা যায় যেমন:
hasRole('ROLE_USER')- ইউজার যদি 'USER' রোল না থাকে, মেথডটি এক্সিকিউট হবে না।@PreAuthorize("hasPermission(#user, 'DELETE')")- নির্দিষ্ট শর্তে ফাংশনটি এক্সিকিউট হবে।
২. @PostAuthorize অ্যানোটেশন
@PostAuthorize অ্যানোটেশনটি মেথড এক্সিকিউট হওয়ার পর শর্ত যাচাই করার জন্য ব্যবহৃত হয়। এর মাধ্যমে আপনি মেথডের রিটার্ন ভ্যালু এক্সিকিউট হওয়ার পর পরীক্ষা করতে পারেন যে সেই রিটার্ন ভ্যালুর উপর ভিত্তি করে অনুমতি আছে কিনা।
ব্যবহার:
@PostAuthorizeঅ্যানোটেশনটি রিটার্ন ভ্যালুর উপর ভিত্তি করে অথরাইজেশন নির্ধারণ করে।- এটি সাধারণত এমন ক্ষেত্রে ব্যবহৃত হয় যেখানে মেথডটি কিছু প্রক্রিয়া সম্পাদন করার পর রিটার্ন ডেটার উপর ভিত্তি করে শর্ত নির্ধারণ করা হয়।
উদাহরণ:
@PostAuthorize("returnObject.username == authentication.name")
public User getUser(Long userId) {
return userRepository.findById(userId).orElse(null);
}
এখানে, getUser মেথডটি শুধুমাত্র সেই ক্ষেত্রে রিটার্ন হবে যখন ইউজারের username বর্তমান ইউজারের সাথে মেলে (authentication.name)।
৩. @Secured অ্যানোটেশন
@Secured অ্যানোটেশনটি মেথডের উপর সরাসরি রোল বা অথরিটি ভিত্তিক অ্যাক্সেস কন্ট্রোল প্রয়োগ করতে ব্যবহৃত হয়। এটি একটি সহজ পদ্ধতি যা শুধুমাত্র নির্দিষ্ট রোল বা অনুমতিসমূহকে মেথডের জন্য অনুমোদন দেয়। তবে এটি স্প্রিং এলএক্সপ্রেশন ল্যাঙ্গুয়েজ (SpEL) সমর্থন করে না, যেমন @PreAuthorize বা @PostAuthorize।
ব্যবহার:
@Securedঅ্যানোটেশনটি একাধিক রোলের সাথে ব্যবহৃত হতে পারে।
উদাহরণ:
@Secured("ROLE_ADMIN")
public void createUser(User user) {
// এই মেথডটি শুধুমাত্র "ROLE_ADMIN" রোল থাকা ইউজারের জন্য এক্সিকিউট হবে
userRepository.save(user);
}
এখানে, createUser মেথডটি শুধুমাত্র সেই ব্যবহারকারীদের জন্য এক্সিকিউট হবে যাদের রোল "ROLE_ADMIN"।
তুলনা:
| অ্যানোটেশন | কাজের প্রক্রিয়া | সুবিধা | উদাহরণ |
|---|---|---|---|
@PreAuthorize | মেথড এক্সিকিউট হওয়ার আগে শর্ত যাচাই | স্পেল এক্সপ্রেশন ব্যবহার করা যায় | @PreAuthorize("hasRole('ADMIN')") |
@PostAuthorize | মেথড এক্সিকিউট হওয়ার পরে শর্ত যাচাই | রিটার্ন ভ্যালুর উপর ভিত্তি করে অনুমতি যাচাই | @PostAuthorize("returnObject.username == authentication.name") |
@Secured | নির্দিষ্ট রোল ভিত্তিক অথরাইজেশন | সহজ রোল ভিত্তিক অথরাইজেশন | @Secured("ROLE_ADMIN") |
উপসংহার:
@PreAuthorizeএবং@PostAuthorizeঅ্যানোটেশনগুলির মাধ্যমে আপনি স্প্রিং সিকিউরিটিতে খুবই শক্তিশালী অথরাইজেশন পলিসি তৈরি করতে পারেন, যেহেতু এই দুটি স্পেল এক্সপ্রেশন সমর্থন করে, যা আরও নমনীয় কনফিগারেশন দেয়।@Securedএকটি সরল পদ্ধতি, যেখানে আপনি সহজে রোল-ভিত্তিক এক্সেস কন্ট্রোল করতে পারেন।
এই অ্যানোটেশনগুলি ব্যবহার করে আপনি স্প্রিং অ্যাপ্লিকেশনে মেথড লেভেল অথরাইজেশন এবং সিকিউরিটি প্রয়োগ করতে পারবেন।
Spring Security তে Method-Level Security হল এমন একটি প্রক্রিয়া যার মাধ্যমে আপনি মেথড লেভেলে নিরাপত্তা কনফিগার করতে পারেন। এটি আপনাকে নির্দিষ্ট মেথডে কোন রোল বা পারমিশন অ্যাসাইন করতে সাহায্য করে। Spring Security এর Method-Level Security কনফিগারেশন দুইটি প্রধান পদ্ধতিতে করা যায়:
- @PreAuthorize: মেথডের উপরে এনোটেশন ব্যবহার করে অ্যাক্সেস নিয়ন্ত্রণ।
- @Secured: নির্দিষ্ট রোল বা অথোরাইজেশন চেকের জন্য ব্যবহৃত হয়।
- @RolesAllowed: স্পেসিফিক রোলের জন্য মেথড অ্যাক্সেস কন্ট্রোল করে।
এছাড়াও, @EnableGlobalMethodSecurity এনোটেশন দিয়ে Method-level security চালু করতে হয়।
ধাপ ১: Method-Level Security চালু করা
@EnableGlobalMethodSecurity এনোটেশন ব্যবহার করে Method-Level Security সক্রিয় করতে হয়। এটি আপনার Spring Security কনফিগারেশন ক্লাসে যুক্ত করতে হবে।
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true, jsr250Enabled = true)
public class SecurityConfig {
// Method-level security এখানে কনফিগার করা হবে
}
এখানে prePostEnabled = true, securedEnabled = true, এবং jsr250Enabled = true ব্যবহার করা হয়েছে। এই প্যারামিটারগুলি method-level security এর জন্য বিভিন্ন বৈশিষ্ট্য সক্ষম করে।
- prePostEnabled: @PreAuthorize এবং @PostAuthorize এনোটেশনগুলির জন্য সক্রিয় করা হয়।
- securedEnabled: @Secured এনোটেশন সমর্থন করতে সক্ষম করা হয়।
- jsr250Enabled: @RolesAllowed এনোটেশন সমর্থন করতে সক্ষম করা হয়।
ধাপ ২: Method-Level Security কনফিগারেশন উদাহরণ
এখন, Method-Level Security কনফিগার করতে আমরা বিভিন্ন এনোটেশন ব্যবহার করব:
1. @PreAuthorize (Pre Authorization)
@PreAuthorize এনোটেশন ব্যবহার করে আমরা নির্দিষ্ট শর্তে অ্যাক্সেস অনুমোদন বা প্রত্যাখ্যান করতে পারি। এই এনোটেশনটি স্প্রিং এলএক্সপ্রেশন ল্যাঙ্গুয়েজ (SpEL) ব্যবহার করে কন্ডিশন চেক করতে দেয়।
উদাহরণ:
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
@Service
public class UserService {
@PreAuthorize("hasRole('ADMIN')")
public void createUser() {
System.out.println("User created");
}
@PreAuthorize("hasRole('USER')")
public void viewUser() {
System.out.println("User details viewed");
}
@PreAuthorize("hasRole('USER') and #userId == authentication.principal.id")
public void updateUser(Long userId) {
System.out.println("User updated");
}
}
এখানে:
createUser()মেথড শুধুমাত্রADMINরোল দ্বারা অ্যাক্সেস করা যাবে।viewUser()মেথড শুধুমাত্রUSERরোল দ্বারা অ্যাক্সেস করা যাবে।updateUser(Long userId)মেথডে এটি যাচাই করা হয় যে, ব্যবহারকারী যেuserIdপাস করবে তা ঐ ব্যবহারকারীর নিজের আইডি।
2. @Secured (Role-Based Security)
@Secured এনোটেশন ব্যবহার করে আমরা মেথড লেভেলে রোল-ভিত্তিক নিরাপত্তা নিশ্চিত করতে পারি। এটি সাধারণত রোল নামের তালিকা গ্রহণ করে।
উদাহরণ:
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Service;
@Service
public class ProductService {
@Secured("ROLE_ADMIN")
public void deleteProduct() {
System.out.println("Product deleted");
}
@Secured({"ROLE_ADMIN", "ROLE_USER"})
public void viewProduct() {
System.out.println("Product viewed");
}
}
এখানে:
deleteProduct()মেথড শুধুমাত্রROLE_ADMINরোল দ্বারা অ্যাক্সেস করা যাবে।viewProduct()মেথডROLE_ADMINএবংROLE_USERউভয় রোল দ্বারা অ্যাক্সেস করা যাবে।
3. @RolesAllowed (JSR-250 Standard)
@RolesAllowed এনোটেশনটি JSR-250 স্ট্যান্ডার্ড অনুসরণ করে এবং ব্যবহারকারীর রোলের ভিত্তিতে মেথড অ্যাক্সেস নিয়ন্ত্রণ করে।
উদাহরণ:
import javax.annotation.security.RolesAllowed;
import org.springframework.stereotype.Service;
@Service
public class OrderService {
@RolesAllowed("ADMIN")
public void cancelOrder() {
System.out.println("Order cancelled");
}
@RolesAllowed({"USER", "ADMIN"})
public void placeOrder() {
System.out.println("Order placed");
}
}
এখানে:
cancelOrder()মেথড শুধুমাত্রADMINরোল দ্বারা অ্যাক্সেস করা যাবে।placeOrder()মেথডUSERঅথবাADMINরোল দ্বারা অ্যাক্সেস করা যাবে।
ধাপ ৩: Method-Level Security কনফিগারেশন ও টেস্ট
এখন, যেহেতু আমরা মেথড-লেভেল নিরাপত্তা কনফিগার করেছি, চলুন একটি উদাহরণ তৈরি করি যেখানে আমরা UserService এবং ProductService এর মেথডগুলো অ্যাক্সেস করার জন্য রোল যাচাই করি।
উদাহরণ:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SecurityTestController {
@Autowired
private UserService userService;
@Autowired
private ProductService productService;
@GetMapping("/createUser")
public String createUser() {
userService.createUser(); // This should be accessible only by ADMIN
return "User created";
}
@GetMapping("/viewUser")
public String viewUser() {
userService.viewUser(); // This should be accessible only by USER
return "User details viewed";
}
@GetMapping("/deleteProduct")
public String deleteProduct() {
productService.deleteProduct(); // This should be accessible only by ADMIN
return "Product deleted";
}
@GetMapping("/placeOrder")
public String placeOrder() {
productService.placeOrder(); // This should be accessible by both USER and ADMIN
return "Order placed";
}
}
এখন, এই API গুলোটি ব্যবহারকারী যখন কল করবে, তখন শুধুমাত্র নির্দিষ্ট রোলের ব্যবহারকারীই সেই মেথডগুলো অ্যাক্সেস করতে পারবে।
উপসংহার
Method-Level Security Spring Security-তে নিরাপত্তার একটি শক্তিশালী উপাদান যা আপনাকে মেথডের স্তরে নিরাপত্তা কনফিগার করার সুবিধা দেয়। @PreAuthorize, @Secured, এবং @RolesAllowed এনোটেশনগুলি আপনাকে নির্দিষ্ট রোল বা শর্ত অনুযায়ী মেথড অ্যাক্সেস নিয়ন্ত্রণ করতে সহায়ক। Spring Security এ এই কনফিগারেশন অত্যন্ত কাস্টমাইজযোগ্য এবং সহজে পরিচালনা করা যায়।
Read more